wayland: calculate screen physical size
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 14 Aug 2015 10:05:37 +0000 (12:05 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 16 Aug 2015 02:11:10 +0000 (22:11 -0400)
A simple calculation is done so far (assuming monitor areas never overlap)
so gdk_screen_get_width/height_mm return meaningful values.

https://bugzilla.gnome.org/show_bug.cgi?id=753621

gdk/wayland/gdkscreen-wayland.c

index ee95107fb2316b5df1249010528f118b812ac61b..e60e9fcd8f3e2d15b5bfa2a87246013f57d171e3 100644 (file)
@@ -1007,25 +1007,52 @@ _gdk_wayland_screen_init (GdkWaylandScreen *screen_wayland)
 static void
 update_screen_size (GdkWaylandScreen *screen_wayland)
 {
+  gboolean emit_changed = FALSE;
   gint width, height;
+  gint width_mm, height_mm;
   gint i;
 
   width = height = 0;
+  width_mm = height_mm = 0;
   for (i = 0; i < screen_wayland->monitors->len; i++)
     {
       GdkWaylandMonitor *monitor = screen_wayland->monitors->pdata[i];
 
+      /* XXX: Largely assuming here that monitor areas
+       * are contiguous and never overlap.
+       */
+      if (monitor->geometry.x > 0)
+        width_mm += monitor->width_mm;
+      else
+        width_mm = MAX (width_mm, monitor->width_mm);
+
+      if (monitor->geometry.y > 0)
+        height_mm += monitor->height_mm;
+      else
+        height_mm = MAX (height_mm, monitor->height_mm);
+
       width = MAX (width, monitor->geometry.x + monitor->geometry.width);
       height = MAX (height, monitor->geometry.y + monitor->geometry.height);
     }
 
+  if (screen_wayland->width_mm != width_mm ||
+      screen_wayland->height_mm != height_mm)
+    {
+      emit_changed = TRUE;
+      screen_wayland->width_mm = width_mm;
+      screen_wayland->height_mm = height_mm;
+    }
+
   if (screen_wayland->width != width ||
       screen_wayland->height != height)
     {
+      emit_changed = TRUE;
       screen_wayland->width = width;
       screen_wayland->height = height;
-      g_signal_emit_by_name (screen_wayland, "size-changed");
     }
+
+  if (emit_changed)
+    g_signal_emit_by_name (screen_wayland, "size-changed");
 }
 
 static void